package com.scott.ch400.atguigu.ch038;

/**
 * @author 黄后林
 * @date 2022-08-12 12:31:56
 * @note 单向环形链表=约瑟夫环
 */
public class Joseph {

    public static void main(String[] args) {
        Joseph joseph = new Joseph();

        //测试构建环形链表和遍历是否正确

        CircleSingleLinkedList list = new CircleSingleLinkedList();
        list.addBoy(15); //加入5个小孩
        list.printBoy();
    }
}

//创建1个环形的单向链表
class CircleSingleLinkedList{

    //1、创建1个first结点、当前没有编号 [ 因为编号是什么、我不知道、所以先随便写1个 ]
    private Boy first = new Boy(-1);

    //2、添加小孩节点、构建成环形链表
    // numbers = 整个环形链表有几个小孩
    public void addBoy(int numbers){

        // 1、做检验
        if(numbers<1){
            System.out.println("数据numbers的值不正确...");
            return;
        }

        Boy curBoy=null; //辅助指针，帮助构建环形链表

        // 2、使用for来创建循环链表
        for(int index=1;index<=numbers;index++){

            //根据编号，创建小孩
            Boy boy = new Boy(index);

            //如果是第1个小孩 要形成环状
            if(index==1){
                first=boy;
                first.setNext(first);
                curBoy=first; //curBoy表示当前小孩
            }else{
                curBoy.setNext(boy);      //让curBoy的next指针指向boy
                boy.setNext(first);       //让boy的next指针指向first
                curBoy=boy;               //把curBoy指针往后移动1位
            }

        }

    }


    //打印环形链表
    public void printBoy(){

        if(null == first){
            System.out.println("没有任何小孩，环形链表为空...");
            return;
        }

        //因为first不能动[因为后面还会用到它]，因为我们仍然使用1个辅助指针完成遍历
        Boy curBoy=first;

        while(true){
            System.out.printf("小孩的编号 %d \n", curBoy.getNo());

            if(curBoy.getNext() == first){
                // 说明已经遍历完毕
                break;
            }
            curBoy =curBoy.getNext(); //往后移动1位

        }


    }

}



// 先创建1个Boy类 表示1个节点
class Boy{

    //1、编号
    private int no;

    //2、指向下1个节点的指针、默认为null
    private Boy next;

    //3、添加构造方法
    public Boy(int no) {
        this.no = no;
    }

    //4、生成set和get方法

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public Boy getNext() {
        return next;
    }

    public void setNext(Boy next) {
        this.next = next;
    }
}